package ebj.common.generic;

public interface GenericInterface<T> {
	public String getClassName();
}

/**
 * <p>功能说明:定义泛型接口，并且该泛型接口扩展自另一个泛型接口GenericInterface<T>,
 * 同时，该泛型接口也拓展了泛型的形参个数</p>
 * @author zhoushineyoung@hotmail.com
 * @time 2016年9月25日 下午2:15:45
 * @param <T>
 */
interface SubInterface<T, S> extends GenericInterface<T>{
	public String getClassName2();
}

/**
 * <p>功能说明:一个实现了某个泛型接口的类， * 其本身也必须是泛型的，并且泛型的类型
 * 参数定义和其实现的接口泛型类型参数相同</p>
 * @author zhoushineyoung@hotmail.com
 * @time 2016年9月25日 下午2:20:56
 * @param <T>
 */
class SubClass<T, S> implements SubInterface<T, S> {
	private T t;
	private S s;
	
	public SubClass(T t, S s) {
		super();
		this.t = t;
		this.s = s;
	}

	@Override
	public String getClassName() {
		// TODO Auto-generated method stub
		return this.t.getClass().getName();
	}

	@Override
	public String getClassName2() {
		// TODO Auto-generated method stub
		return s.getClass().getName();
	}
	
	public void printVals(){
		System.out.println(t + " - " + s);
	}
}

/**
 * <p>功能说明:实现了一个“具体的泛型接口”的类型本身可以非泛型的</p>
 * @author zhoushineyoung@hotmail.com
 * @time 2016年9月25日 下午2:30:23
 * @param <T>
 */
class SubClass2 implements SubInterface<String, Double>{
	private String first;
	private Double second;
	
	public SubClass2(String first, Double second) {
		super();
		this.first = first;
		this.second = second;
	}

	@Override
	public String getClassName() {
		// TODO Auto-generated method stub
		return this.getClass().getName();
	}

	@Override
	public String getClassName2() {
		// TODO Auto-generated method stub
		return this.getClass().getSuperclass().getName();
	}
	
}

class Client3 {
	public static void main(String[] args) {
		SubClass<Integer, String> subClass01 = new SubClass<Integer, String>(12, "北京姑娘");
		System.out.println(subClass01.getClassName());
		System.out.println(subClass01.getClassName2());
		subClass01.printVals();
		
		SubClass2 subClass2 = new SubClass2("test", Double.valueOf(12.56));
		System.err.println(subClass2.getClassName());
		System.err.println(subClass2.getClassName2());
		
	}

}
